home *** CD-ROM | disk | FTP | other *** search
/ CD BIT 75 / CD BIT 75.iso / Software / mysql-4.0.22-win / data1.cab / Development / examples / tests / grant.pl < prev    next >
Encoding:
Perl Script  |  2004-10-28  |  26.7 KB  |  734 lines

  1. #!/usr/bin/perl
  2. #
  3. # Testing of grants.
  4. # Note that this will delete all table and column grants !
  5. #
  6.  
  7. use DBI;
  8. use Getopt::Long;
  9. use strict;
  10.  
  11. use vars qw($dbh $user_dbh $opt_help $opt_Information $opt_force $opt_debug
  12.         $opt_verbose $opt_server $opt_root_user $opt_password $opt_user
  13.         $opt_database $opt_host $version $user $tables_cols $columns_cols
  14.         $tmp_table $opt_silent);
  15.  
  16. $version="1.1";
  17. $opt_help=$opt_Information=$opt_force=$opt_debug=$opt_verbose=$opt_silent=0;
  18. $opt_host="localhost",
  19. $opt_server="mysql";
  20. $opt_root_user="root";
  21. $opt_password="";
  22. $opt_user="grant_user";
  23. $opt_database="grant_test";
  24.  
  25. GetOptions("Information","help","server=s","root-user=s","password=s","user","database=s","force","host=s","debug","verbose","silent") || usage();
  26. usage() if ($opt_help || $opt_Information);
  27.  
  28. $user="$opt_user\@$opt_host";
  29.  
  30. if (!$opt_force)
  31. {
  32.   print_info()
  33. }
  34.  
  35. $|=1;
  36.  
  37. $tables_cols="Host, Db, User, Table_name, Grantor, Table_priv, Column_priv";
  38. $columns_cols="Host, Db, User, Table_name, Column_name, Column_priv";
  39. $tmp_table="/tmp/mysql-grant.test"; # Can't use $$ as we are logging result
  40. unlink($tmp_table);
  41.  
  42. #
  43. # clear grant tables
  44. #
  45.  
  46. $dbh = DBI->connect("DBI:mysql:mysql:$opt_host",
  47.             $opt_root_user,$opt_password,
  48.             { PrintError => 0}) || die "Can't connect to mysql server with user '$opt_root_user': $DBI::errstr\n";
  49.  
  50. safe_query("delete from user where user='$opt_user' or user='${opt_user}2'");
  51. safe_query("delete from db where user='$opt_user'");
  52. safe_query("delete from tables_priv");
  53. safe_query("delete from columns_priv");
  54. safe_query("lock tables mysql.user write"); # Test lock tables
  55. safe_query("flush privileges");
  56. safe_query("unlock tables");         # should already be unlocked
  57. safe_query("drop database $opt_database",3);    # Don't print possible error
  58. safe_query("create database $opt_database");
  59.  
  60. # check that the user can't login yet
  61.  
  62. user_connect(1);
  63. #goto test;
  64.  
  65. #
  66. # Enable column grant code
  67. #
  68. safe_query("grant select(user) on mysql.user to $user");
  69. safe_query("revoke select(user) on mysql.user from $user");
  70.  
  71. #
  72. # Test grants on user level
  73. #
  74.  
  75. safe_query("grant select on *.* to $user");
  76. safe_query("set password FOR ${opt_user}2\@$opt_host = password('test')",1);
  77. safe_query("set password FOR $opt_user=password('test')");
  78. user_connect(1);
  79. safe_query("set password FOR $opt_user=''");
  80. user_connect(0);
  81. user_query("select * from mysql.user where user = '$opt_user'");
  82. user_query("select * from mysql.db where user = '$opt_user'");
  83. safe_query("grant select on *.* to $user,$user");
  84. safe_query("show grants for $user");
  85. user_connect(0);
  86.  
  87. # The following should fail
  88. user_query("insert into mysql.user (host,user) values ('error','$opt_user')",1);
  89. user_query("update mysql.user set host='error' WHERE user='$opt_user'",1);
  90. user_query("create table $opt_database.test (a int,b int)",1);
  91. user_query("grant select on *.* to ${opt_user}2\@$opt_host",1);
  92. safe_query("revoke select on $opt_database.test from $opt_user\@opt_host",1);
  93. safe_query("revoke select on $opt_database.* from $opt_user\@opt_host",1);
  94. safe_query("revoke select on *.* from $opt_user",1);
  95. safe_query("grant select on $opt_database.not_exists to $opt_user",1);
  96. safe_query("grant FILE on $opt_database.test to $opt_user",1);
  97. safe_query("grant select on *.* to wrong___________user_name",1);
  98. safe_query("grant select on $opt_database.* to wrong___________user_name",1);
  99. user_connect(0);
  100. user_query("grant select on $opt_database.test to $opt_user with grant option",1);
  101. safe_query("set password FOR ''\@''=''",1);
  102. user_query("set password FOR root\@$opt_host = password('test')",1);
  103.  
  104. # Change privileges for user
  105. safe_query("revoke select on *.* from $user");
  106. safe_query("grant create,update on *.* to $user");
  107. user_connect(0);
  108. safe_query("flush privileges");
  109. user_query("create table $opt_database.test (a int,b int)");
  110. user_query("update $opt_database.test set b=b+1 where a > 0",1);
  111. safe_query("show grants for $user");
  112. safe_query("revoke update on *.* from $user");
  113. user_connect(0);
  114. safe_query("grant select(c) on $opt_database.test to $user",1);
  115. safe_query("revoke select(c) on $opt_database.test from $user",1);
  116. safe_query("grant select on $opt_database.test to wrong___________user_name",1);
  117. user_query("INSERT INTO $opt_database.test values (2,0)",1);
  118.  
  119. safe_query("grant ALL PRIVILEGES on *.* to $user");
  120. safe_query("REVOKE INSERT on *.* from $user");
  121. user_connect(0);
  122. user_query("INSERT INTO $opt_database.test values (1,0)",1);
  123. safe_query("grant INSERT on *.* to $user");
  124. user_connect(0);
  125. user_query("INSERT INTO $opt_database.test values (2,0)");
  126. user_query("select count(*) from $opt_database.test");
  127. safe_query("revoke SELECT on *.* from $user");
  128. user_connect(0);
  129. user_query("select count(*) from $opt_database.test",1);
  130. user_query("INSERT INTO $opt_database.test values (3,0)");
  131. safe_query("grant SELECT on *.* to $user");
  132. user_connect(0);
  133. user_query("select count(*) from $opt_database.test");
  134. safe_query("revoke ALL PRIVILEGES on *.* from $user");
  135. user_connect(1);
  136. safe_query("delete from user where user='$opt_user'");
  137. safe_query("flush privileges");
  138. if (0)                # Only if no anonymous user on localhost.
  139. {
  140.   safe_query("grant select on *.* to $opt_user");
  141.   user_connect(0);
  142.   safe_query("revoke select on *.* from $opt_user");
  143.   user_connect(1);
  144. }
  145. safe_query("delete from user where user='$opt_user'");
  146. safe_query("flush privileges");
  147.  
  148. #
  149. # Test grants on database level
  150. #
  151. safe_query("grant select on $opt_database.* to $user");
  152. safe_query("select * from mysql.user where user = '$opt_user'");
  153. safe_query("select * from mysql.db where user = '$opt_user'");
  154. user_connect(0);
  155. user_query("select count(*) from $opt_database.test");
  156. # The following should fail
  157. user_query("select * from mysql.user where user = '$opt_user'",1);
  158. user_query("insert into $opt_database.test values (4,0)",1);
  159. user_query("update $opt_database.test set a=1",1); 
  160. user_query("delete from $opt_database.test",1); 
  161. user_query("create table $opt_database.test2 (a int)",1);
  162. user_query("ALTER TABLE $opt_database.test add c int",1);
  163. user_query("CREATE INDEX dummy ON $opt_database.test (a)",1);
  164. user_query("drop table $opt_database.test",1);
  165. user_query("grant ALL PRIVILEGES on $opt_database.* to ${opt_user}2\@$opt_host",1);
  166.  
  167. # Change privileges for user
  168. safe_query("grant ALL PRIVILEGES on $opt_database.* to $user WITH GRANT OPTION");
  169. user_connect(0);
  170. user_query("insert into $opt_database.test values (5,0)");
  171. safe_query("REVOKE ALL PRIVILEGES on * from $user",1);
  172. safe_query("REVOKE ALL PRIVILEGES on *.* from $user");
  173. safe_query("REVOKE ALL PRIVILEGES on $opt_database.* from $user");
  174. safe_query("REVOKE ALL PRIVILEGES on $opt_database.* from $user");
  175. user_connect(0);
  176. user_query("insert into $opt_database.test values (6,0)",1);
  177. safe_query("REVOKE GRANT OPTION on $opt_database.* from $user");
  178. user_connect(1);
  179. safe_query("grant ALL PRIVILEGES on $opt_database.* to $user");
  180.  
  181. user_connect(0);
  182. user_query("select * from mysql.user where user = '$opt_user'",1);
  183. user_query("insert into $opt_database.test values (7,0)");
  184. user_query("update $opt_database.test set a=3 where a=2"); 
  185. user_query("delete from $opt_database.test where a=3"); 
  186. user_query("create table $opt_database.test2 (a int not null)");
  187. user_query("alter table $opt_database.test2 add b int");
  188. user_query("create index dummy on $opt_database.test2 (a)");
  189. user_query("update test,test2 SET test.a=test2.a where test.a=test2.a");
  190. user_query("drop table $opt_database.test2");
  191. user_query("show tables from grant_test");
  192. # These should fail
  193. user_query("insert into mysql.user (host,user) values ('error','$opt_user',0)",1);
  194.  
  195. # Revoke database privileges
  196. safe_query("revoke ALL PRIVILEGES on $opt_database.* from $user");
  197. safe_query("select * from mysql.user where user = '$opt_user'");
  198. safe_query("select * from mysql.db where user = '$opt_user'");
  199.  
  200. # Test multi-updates
  201. safe_query("grant CREATE,UPDATE,DROP on $opt_database.* to $user");
  202. user_connect(0);
  203. user_query("create table $opt_database.test2 (a int not null)");
  204. user_query("update test,test2 SET test.a=1 where 1");
  205. user_query("update test,test2 SET test.a=test2.a where 1",1);
  206. safe_query("grant SELECT on $opt_database.* to $user");
  207. user_connect(0);
  208. user_query("update test,test2 SET test.a=test2.a where test2.a=test.a");
  209. user_query("drop table $opt_database.test2");
  210.  
  211. # Revoke database privileges
  212. safe_query("revoke ALL PRIVILEGES on $opt_database.* from $user");
  213. user_connect(1);
  214.  
  215. #
  216. # Test of grants on table level
  217. #
  218.  
  219. safe_query("grant create on $opt_database.test2 to $user");
  220. user_connect(0);
  221. user_query("create table $opt_database.test2 (a int not null)");
  222. user_query("show tables");    # Should only show test, not test2
  223. user_query("show columns from test",1);
  224. user_query("show keys from test",1);
  225. user_query("show columns from test2");
  226. user_query("show keys from test2");
  227. user_query("select * from test",1);
  228. safe_query("grant insert on $opt_database.test to $user");
  229. user_query("show tables");
  230. user_query("insert into $opt_database.test values (8,0)");
  231. user_query("update $opt_database.test set b=1",1);
  232. safe_query("grant update on $opt_database.test to $user");
  233. user_query("update $opt_database.test set b=2");
  234.  
  235. user_query("update $opt_database.test,test2 SET test.b=3",1);
  236. safe_query("grant select on $opt_database.test2 to $user");
  237. user_query("update $opt_database.test,test2 SET test.b=3");
  238. safe_query("revoke select on $opt_database.test2 from $user");
  239.  
  240. user_query("delete from $opt_database.test",1);
  241. safe_query("grant delete on $opt_database.test to $user");
  242. user_query("delete from $opt_database.test where a=1",1);
  243. user_query("update $opt_database.test set b=3 where b=1",1);
  244. user_query("update $opt_database.test set b=b+1",1);
  245. user_query("update $opt_database.test,test2 SET test.a=test2.a",1);
  246.  
  247. #
  248. # Test global SELECT privilege combined with table level privileges
  249. #
  250.  
  251. safe_query("grant SELECT on *.* to $user");
  252. user_connect(0);
  253. user_query("update $opt_database.test set b=b+1");
  254. user_query("update $opt_database.test set b=b+1 where a > 0");
  255. user_query("update $opt_database.test,test2 SET test.a=test2.a");
  256. user_query("update $opt_database.test,test2 SET test2.a=test.a",1);
  257. safe_query("revoke SELECT on *.* from $user");
  258. safe_query("grant SELECT on $opt_database.* to $user");
  259. user_connect(0);
  260. user_query("update $opt_database.test set b=b+1");
  261. user_query("update $opt_database.test set b=b+1 where a > 0");
  262. safe_query("grant UPDATE on *.* to $user");
  263. user_connect(0);
  264. user_query("update $opt_database.test set b=b+1");
  265. user_query("update $opt_database.test set b=b+1 where a > 0");
  266. safe_query("revoke UPDATE on *.* from $user");
  267. safe_query("revoke SELECT on $opt_database.* from $user");
  268. user_connect(0);
  269. user_query("update $opt_database.test set b=b+1 where a > 0",1);
  270. user_query("update $opt_database.test set b=b+1",1);
  271.  
  272. # Add one privilege at a time until the user has all privileges
  273. user_query("select * from test",1);
  274. safe_query("grant select on $opt_database.test to $user");
  275. user_query("delete from $opt_database.test where a=1");
  276. user_query("update $opt_database.test set b=2 where b=1");
  277. user_query("update $opt_database.test set b=b+1");
  278. user_query("select count(*) from test");
  279. user_query("update test,test2 SET test.b=4",1);
  280. user_query("update test,test2 SET test2.a=test.a",1);
  281. user_query("update test,test2 SET test.a=test2.a",1);
  282.  
  283. user_query("create table $opt_database.test3 (a int)",1);
  284. user_query("alter table $opt_database.test2 add c int",1);
  285. safe_query("grant alter on $opt_database.test2 to $user");
  286. user_query("alter table $opt_database.test2 add c int");
  287. user_query("create index dummy ON $opt_database.test (a)",1);
  288. safe_query("grant index on $opt_database.test2 to $user");
  289. user_query("create index dummy ON $opt_database.test2 (a)");
  290. user_query("insert into test2 SELECT a,a from test",1);
  291. safe_query("grant insert on test2 to $user",1);    # No table: mysql.test2
  292. safe_query("grant insert(a) on $opt_database.test2 to $user");
  293. user_query("insert into test2 SELECT a,a from test",1);
  294. safe_query("grant insert(c) on $opt_database.test2 to $user");
  295. user_query("insert into test2 SELECT a,a from test");
  296. user_query("select count(*) from test2,test",1);
  297. user_query("select count(*) from test,test2",1);
  298. user_query("replace into test2 SELECT a from test",1);
  299. safe_query("grant update on $opt_database.test2 to $user");
  300. user_query("update test,test2 SET test2.a=test.a");
  301. user_query("update test,test2 SET test.b=test2.a where 0",1);
  302. user_query("update test,test2 SET test.a=2 where test2.a>100",1);
  303. user_query("update test,test2 SET test.a=test2.a",1);
  304. user_query("replace into test2 SELECT a,a from test",1);
  305. safe_query("grant DELETE on $opt_database.test2 to $user");
  306. user_query("replace into test2 SELECT a,a from test");
  307. user_query("insert into test (a) SELECT a from test2",1);
  308. safe_query("grant SELECT on $opt_database.test2 to $user");
  309. user_query("update test,test2 SET test.b=test2.a where 0");
  310. user_query("update test,test2 SET test.a=test2.a where test2.a>100");
  311.  
  312. safe_query("revoke UPDATE on $opt_database.test2 from $user");
  313. safe_query("grant UPDATE (c) on $opt_database.test2 to $user");
  314. user_query("update test,test2 SET test.b=test2.a where 0");
  315. user_query("update test,test2 SET test.a=test2.a where test2.a>100");
  316. user_query("update test,test2 SET test2.a=test2.a where test2.a>100",1);
  317. user_query("update test,test2 SET test2.c=test2.a where test2.a>100");
  318.  
  319. safe_query("revoke SELECT,UPDATE on $opt_database.test2 from $user");
  320. safe_query("grant UPDATE on $opt_database.test2 to $user");
  321.  
  322. user_query("drop table $opt_database.test2",1);
  323. user_query("grant select on $opt_database.test2 to $user with grant option",1);
  324. safe_query("grant drop on $opt_database.test2 to $user with grant option");
  325. user_query("grant drop on $opt_database.test2 to $user with grant option");
  326. user_query("grant select on $opt_database.test2 to $user with grant option",1);
  327.  
  328. # check rename privileges
  329. user_query("rename table $opt_database.test2 to $opt_database.test3",1);
  330. safe_query("grant CREATE,DROP on $opt_database.test3 to $user");
  331. user_query("rename table $opt_database.test2 to $opt_database.test3",1);
  332. user_query("create table $opt_database.test3 (a int)");
  333. safe_query("grant INSERT on $opt_database.test3 to $user");
  334. user_query("drop table $opt_database.test3");
  335. user_query("rename table $opt_database.test2 to $opt_database.test3");
  336. user_query("rename table $opt_database.test3 to $opt_database.test2",1);
  337. safe_query("grant ALTER on $opt_database.test3 to $user");
  338. user_query("rename table $opt_database.test3 to $opt_database.test2");
  339. safe_query("revoke DROP on $opt_database.test2 from $user");
  340. user_query("rename table $opt_database.test2 to $opt_database.test3");
  341. user_query("drop table if exists $opt_database.test2,$opt_database.test3",1);
  342. safe_query("drop table if exists $opt_database.test2,$opt_database.test3");
  343.  
  344. # Check that the user doesn't have some user privileges
  345. user_query("create database $opt_database",1);
  346. user_query("drop database $opt_database",1);
  347. user_query("flush tables",1);
  348. safe_query("flush privileges");
  349.  
  350. safe_query("select $tables_cols from mysql.tables_priv");
  351. safe_query("revoke ALL PRIVILEGES on $opt_database.test from $user");
  352. safe_query("revoke ALL PRIVILEGES on $opt_database.test2 from $user");
  353. safe_query("revoke ALL PRIVILEGES on $opt_database.test3 from $user");
  354. safe_query("revoke GRANT OPTION on $opt_database.test2 from $user");
  355. safe_query("select $tables_cols from mysql.tables_priv");
  356. user_query("select count(a) from test",1);
  357.  
  358. #
  359. # Test some grants on column level
  360. #
  361.  
  362. safe_query("grant create,update on $opt_database.test2 to $user");
  363. user_query("create table $opt_database.test2 (a int not null)");
  364. user_query("delete from $opt_database.test where a=2",1);
  365. user_query("delete from $opt_database.test where A=2",1);
  366. user_query("update test set b=5 where b>0",1);
  367. user_query("update test,test2 SET test.b=5 where b>0",1);
  368.  
  369. safe_query("grant update(b),delete on $opt_database.test to $user");
  370. safe_query("revoke update(a) on $opt_database.test from $user",1);
  371. user_query("delete from $opt_database.test where a=2",1);
  372. user_query("update test set b=5 where b>0",1);
  373. safe_query("grant select(a),select(b) on $opt_database.test to $user");
  374. user_query("delete from $opt_database.test where a=2");
  375. user_query("delete from $opt_database.test where A=2");
  376. user_query("update test set b=5 where b>0");
  377. user_query("update test set a=11 where b>5",1);
  378. user_query("update test,test2 SET test.b=5 where b>0");
  379. user_query("update test,test2 SET test.a=11 where b>0",1);
  380. user_query("update test,test2 SET test.b=test2.a where b>0",1);
  381. user_query("update test,test2 SET test.b=11 where test2.a>0",1);
  382. user_query("select a,A from test");
  383.  
  384. safe_query("select $tables_cols from mysql.tables_priv");
  385. safe_query("revoke ALL PRIVILEGES on $opt_database.test from $user");
  386. safe_query("select $tables_cols from mysql.tables_priv");
  387. safe_query("revoke GRANT OPTION on $opt_database.test from $user",1);
  388. safe_query("drop table $opt_database.test2");
  389. safe_query("revoke create,update on $opt_database.test2 from $user");
  390.  
  391. #
  392. # Test grants on database level
  393. #
  394.  
  395. safe_query("grant select(a) on $opt_database.test to $user");
  396. user_query("show full columns from test");
  397. safe_query("grant insert (b), update (b) on $opt_database.test to $user");
  398.  
  399. user_query("select count(a) from test");
  400. user_query("select count(skr.a) from test as skr");
  401. user_query("select count(a) from test where a > 5");
  402. user_query("insert into test (b) values (5)");
  403. user_query("insert into test (b) values (a)");
  404. user_query("update test set b=3 where a > 0");
  405.  
  406. user_query("select * from test",1);
  407. user_query("select b from test",1);
  408. user_query("select a from test where b > 0",1);
  409. user_query("insert into test (a) values (10)",1);
  410. user_query("insert into test (b) values (b)",1);
  411. user_query("insert into test (a,b) values (1,5)",1);
  412. user_query("insert into test (b) values (1),(b)",1);
  413. user_query("update test set b=3 where b > 0",1);
  414.  
  415. safe_query("select $tables_cols from mysql.tables_priv");
  416. safe_query("select $columns_cols from mysql.columns_priv");
  417. safe_query("revoke select(a), update (b) on $opt_database.test from $user");
  418. safe_query("select $tables_cols from mysql.tables_priv");
  419. safe_query("select $columns_cols from mysql.columns_priv");
  420.  
  421. user_query("select count(a) from test",1);
  422. user_query("update test set b=4",1);
  423.  
  424. safe_query("grant select(a,b), update (a,b) on $opt_database.test to $user");
  425. user_query("select count(a),count(b) from test where a+b > 0");
  426. user_query("insert into test (b) values (9)");
  427. user_query("update test set b=6 where b > 0");
  428.  
  429. safe_query("flush privileges");    # Test restoring privileges from disk
  430. safe_query("select $tables_cols from mysql.tables_priv");
  431. safe_query("select $columns_cols from mysql.columns_priv");
  432.  
  433. # Try mixing of table and database privileges
  434.  
  435. user_query("insert into test (a,b) values (12,12)",1);
  436. safe_query("grant insert on $opt_database.* to $user");
  437. user_connect(0);
  438. user_query("insert into test (a,b) values (13,13)");
  439.  
  440. # This grants and revokes SELECT on different levels.
  441. safe_query("revoke select(b) on $opt_database.test from $user");
  442. user_query("select count(a) from test where a+b > 0",1);
  443. user_query("update test set b=5 where a=2");
  444. safe_query("grant select on $opt_database.test to $user");
  445. user_connect(0);
  446. user_query("select count(a) from test where a+b > 0");
  447. safe_query("revoke select(b) on $opt_database.test from $user");
  448. user_query("select count(a) from test where a+b > 0");
  449. safe_query("revoke select on $opt_database.test from $user");
  450. user_connect(0);
  451. user_query("select count(a) from test where a+b > 0",1);
  452. safe_query("grant select(a) on $opt_database.test to $user");
  453. user_query("select count(a) from test where a+b > 0",1);
  454. safe_query("grant select on *.* to $user");
  455. user_connect(0);
  456. user_query("select count(a) from test where a+b > 0");
  457. safe_query("revoke select on *.* from $user");
  458. safe_query("grant select(b) on $opt_database.test to $user");
  459. user_connect(0);
  460. user_query("select count(a) from test where a+b > 0");
  461.  
  462.  
  463. safe_query("select * from mysql.db where user = '$opt_user'");
  464. safe_query("select $tables_cols from mysql.tables_priv where user = '$opt_user'");
  465. safe_query("select $columns_cols from mysql.columns_priv where user = '$opt_user'");
  466.  
  467. safe_query("revoke ALL PRIVILEGES on $opt_database.test from $user");
  468. user_query("select count(a) from test",1);
  469. user_query("select * from mysql.user order by hostname",1);
  470. safe_query("select * from mysql.db where user = '$opt_user'");
  471. safe_query("select $tables_cols from mysql.tables_priv where user = '$opt_user'");
  472. safe_query("select $columns_cols from mysql.columns_priv where user = '$opt_user'");
  473.  
  474. #
  475. # Clear up privileges to make future tests easier
  476.  
  477. safe_query("delete from user where user='$opt_user'");
  478. safe_query("delete from db where user='$opt_user'");
  479. safe_query("flush privileges");
  480. safe_query("show grants for $user",1);
  481.  
  482. #
  483. # Test IDENTIFIED BY
  484. #
  485.  
  486. safe_query("grant ALL PRIVILEGES on $opt_database.test to $user identified by 'dummy',  ${opt_user}\@127.0.0.1 identified by 'dummy2'");
  487. user_connect(0,"dummy");
  488. safe_query("grant SELECT on $opt_database.* to $user identified by ''");
  489. user_connect(0);
  490. safe_query("revoke ALL PRIVILEGES on $opt_database.test from $user identified by '', ${opt_user}\@127.0.0.1 identified by 'dummy2'");
  491. safe_query("revoke ALL PRIVILEGES on $opt_database.* from $user identified by ''");
  492.  
  493. safe_query("show grants for $user");
  494.  
  495. #
  496. # Test bug reported in SELECT INTO OUTFILE
  497. #
  498.  
  499. safe_query("create table $opt_database.test3 (a int, b int)");
  500. safe_query("grant SELECT on $opt_database.test3 to $user");
  501. safe_query("grant FILE on *.* to $user");
  502. safe_query("insert into $opt_database.test3 values (1,1)");
  503. user_connect(0);
  504. user_query("select * into outfile '$tmp_table' from $opt_database.test3");
  505. safe_query("revoke SELECT on $opt_database.test3 from $user");
  506. safe_query("grant SELECT(a) on $opt_database.test3 to $user");
  507. user_query("select a from $opt_database.test3");
  508. user_query("select * from $opt_database.test3",1);
  509. user_query("select a,b from $opt_database.test3",1);
  510. user_query("select b from $opt_database.test3",1);
  511.  
  512. safe_query("revoke SELECT(a) on $opt_database.test3 from $user");
  513. safe_query("revoke FILE on *.* from $user");
  514. safe_query("drop table $opt_database.test3");
  515.  
  516. #
  517. # Test privileges needed for LOCK TABLES
  518. #
  519.  
  520. safe_query("create table $opt_database.test3 (a int)");
  521. user_connect(1);
  522. safe_query("grant INSERT on $opt_database.test3 to $user");
  523. user_connect(0);
  524. user_query("select * into outfile '$tmp_table' from $opt_database.test3",1);
  525. safe_query("grant SELECT on $opt_database.test3 to $user");
  526. user_connect(0);
  527. user_query("LOCK TABLES $opt_database.test3 READ",1);
  528. safe_query("grant LOCK TABLES on *.* to $user");
  529. safe_query("show grants for $user");
  530. safe_query("select * from mysql.user where user='$opt_user'");
  531. user_connect(0);
  532. user_query("LOCK TABLES $opt_database.test3 READ");
  533. user_query("UNLOCK TABLES");
  534. safe_query("revoke SELECT,INSERT,UPDATE,DELETE on $opt_database.test3 from $user");
  535. user_connect(0);
  536. safe_query("revoke LOCK TABLES on *.* from $user");
  537. user_connect(1);
  538. safe_query("drop table $opt_database.test3");
  539.  
  540. #
  541. # test new privileges in 4.0.2
  542. #
  543.  
  544. safe_query("show grants for $user");
  545. safe_query("grant all on *.* to $user WITH MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 2 MAX_CONNECTIONS_PER_HOUR 3");
  546. safe_query("show grants for $user");
  547. safe_query("revoke LOCK TABLES on *.* from $user");
  548. safe_query("flush privileges");
  549. safe_query("show grants for $user");
  550. safe_query("revoke ALL PRIVILEGES on *.* from $user");
  551. safe_query("show grants for $user");
  552.  
  553. #
  554. # Clean up things
  555. #
  556.  
  557. unlink($tmp_table);
  558. safe_query("drop database $opt_database");
  559. safe_query("delete from user where user='$opt_user'");
  560. safe_query("delete from db where user='$opt_user'");
  561. safe_query("delete from tables_priv");
  562. safe_query("delete from columns_priv");
  563. safe_query("flush privileges");
  564.  
  565. print "end of test\n";
  566. exit 0;
  567.  
  568. sub usage
  569. {
  570.     print <<EOF;
  571. $0  Ver $version
  572.  
  573. This program tests that the GRANT commands works by creating a temporary
  574. database ($opt_database) and user ($opt_user).
  575.  
  576. Options:
  577.  
  578. --database (Default $opt_database)
  579.   In which database the test tables are created.
  580.  
  581. --force
  582.   Don''t ask any question before starting this test.
  583.  
  584. --host='host name' (Default $opt_host)
  585.   Host name where the database server is located.
  586.  
  587. --Information
  588. --help
  589.   Print this help
  590.  
  591. --password
  592.   Password for root-user.
  593.  
  594. --server='server name'  (Default $opt_server)
  595.   Run the test on the given SQL server.
  596.  
  597. --user  (Default $opt_user)
  598.   A non-existing user on which we will test the GRANT commands.
  599.  
  600. --verbose
  601.   Write all queries when we are execute them.
  602.  
  603. --root-user='user name' (Default $opt_root_user)
  604.   User with privileges to modify the 'mysql' database.
  605. EOF
  606.   exit(0);
  607. }
  608.  
  609.  
  610. sub print_info
  611. {
  612.   my $tmp;
  613.   print <<EOF;
  614. This test will clear your table and column grant table and recreate the
  615. $opt_database database !
  616. All privileges for $user will be destroyed !
  617.  
  618. Don\'t run this test if you have done any GRANT commands that you want to keep!
  619. EOF
  620.  for (;;)
  621.   {
  622.     print "Start test (yes/no) ? ";
  623.     $tmp=<STDIN>; chomp($tmp); $tmp=lc($tmp);
  624.     last if ($tmp =~ /^yes$/i);
  625.     exit 1 if ($tmp =~ /^n/i);
  626.     print "\n";
  627.   }
  628. }
  629.  
  630.  
  631. sub user_connect
  632. {
  633.   my ($ignore_error,$password)=@_;
  634.   $password="" if (!defined($password));
  635.  
  636.   print "Connecting $opt_user\n" if ($opt_verbose);
  637.   $user_dbh->disconnect if (defined($user_dbh));
  638.  
  639.   $user_dbh=DBI->connect("DBI:mysql:$opt_database:$opt_host",$opt_user,
  640.              $password, { PrintError => 0});
  641.   if (!$user_dbh)
  642.   {
  643.     if ($opt_verbose || !$ignore_error)
  644.     {
  645.       print "Error on connect: $DBI::errstr\n";
  646.     }
  647.     if (!$ignore_error)
  648.     {
  649.       die "The above should not have failed!";
  650.     }
  651.   }
  652.   elsif ($ignore_error)
  653.   {
  654.     die "Connect succeeded when it shouldn't have !\n";
  655.   }
  656. }
  657.  
  658. sub safe_query
  659. {
  660.   my ($query,$ignore_error)=@_;
  661.   if (do_query($dbh,$query, $ignore_error))
  662.   {
  663.     if (!defined($ignore_error))
  664.     {
  665.       die "The above should not have failed!";
  666.     }
  667.   }
  668.   elsif (defined($ignore_error) && $ignore_error == 1)
  669.   {
  670.     die "Query '$query' succeeded when it shouldn't have !\n";
  671.   }
  672. }
  673.  
  674.  
  675. sub user_query
  676. {
  677.   my ($query,$ignore_error)=@_;
  678.   if (do_query($user_dbh,$query, $ignore_error))
  679.   {
  680.     if (!defined($ignore_error))
  681.     {
  682.       die "Query '$query' should not have failed!";
  683.     }
  684.   }
  685.   elsif (defined($ignore_error) && $ignore_error == 1)
  686.   {
  687.     die "Query '$query' succeeded when it shouldn't have !\n";
  688.   }
  689. }
  690.  
  691.  
  692. sub do_query
  693. {
  694.   my ($my_dbh, $query, $ignore_error)=@_;
  695.   my ($sth, $row, $tab, $col, $found, $fatal_error);
  696.  
  697.   print "$query\n" if ($opt_debug || $opt_verbose);
  698.   if (!($sth= $my_dbh->prepare($query)))
  699.   {
  700.     print "Error in prepare: $DBI::errstr\n";
  701.     return 1;
  702.   }
  703.   if (!$sth->execute)
  704.   {
  705.     $fatal_error= ($DBI::errstr =~ /parse error/);
  706.     if (!$ignore_error || ($opt_verbose && $ignore_error != 3) || $fatal_error)
  707.     {
  708.       print "Error in execute: $DBI::errstr\n";
  709.     }
  710.     die if ($fatal_error);
  711.     $sth->finish;
  712.     return 1;
  713.   }
  714.   $found=0;
  715.   if (!$opt_silent)
  716.   {
  717.     while (($row=$sth->fetchrow_arrayref))
  718.     {
  719.       $found=1;
  720.       $tab="";
  721.       foreach $col (@$row)
  722.       {
  723.     print $tab;
  724.     print defined($col) ? $col : "NULL";
  725.     $tab="\t";
  726.       }
  727.       print "\n";
  728.     }
  729.     print "\n" if ($found);
  730.   }
  731.   $sth->finish;
  732.   return 0;
  733. }
  734.